home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 361_01 / px.c < prev    next >
C/C++ Source or Header  |  1991-09-18  |  4KB  |  137 lines

  1.  
  2. /* PX.C  --> A Pipe Extension Tool.  14 April 89
  3.  *
  4.  * Author: Jack Ekwall.
  5.  *
  6.  * Works Better if You Compile w/o WildCard Expansion.
  7.  *
  8.  * Copyrighted to the Public Domain.  Unlimited Distribution Autorized.
  9.  *
  10.  * User Assumes All Risks/Liabilities.
  11.  *
  12.  * Last Update:  7 August 90/EK
  13.  *
  14.  */
  15.  
  16. #include <stdio.h>
  17. #include <io.h>
  18. #include <ctype.h>
  19. #include <stdlib.h>
  20. #include <stdek.h>
  21. #include <string.h>
  22.  
  23. char *Documentation[] = {
  24.     "",
  25. "Usage:",
  26. "       PX [options] [Command [Arguements] or $Pipe]  --> Extend DOS Piping.",
  27.     "",
  28. "Option Flags are Required in .BAT Files:",
  29. "         /A ---> Append to Specified Pipe.",
  30. "         /R ---> Read From Specified Pipe.  [Force OutFlow]",
  31. "         /W ---> Write to Specified Pipe.",
  32.     "",
  33. "Pipes:",
  34. "    1. PX \"Pipe Extends\" DOS stdin/stdout Pipes using ordinary Files w/ ",
  35. "       Unusual Names.  These Names can not be Generated by DOS.",
  36. "    2. A \"Named\" Pipe name is 1-4 Alphanumeric Characters Preceeded by '$'.",
  37.     "",
  38. "Action:",
  39. "    1. If InFlow Redirection, Create the Specified $Pipe ($IN is Default).",
  40. "    2. If a Command is Passed in, Shells Out & Execute it.",
  41. "    3. If Redirected to a File/DOS Pipe, Print Contents of Specified $Pipe.",
  42. "         (Default is $OUT if found, otherwise $IN).",
  43. "    4. PX erases $Pipe after reading.",
  44.     NULL};
  45.  
  46. /* Declare Prototypes */
  47. void Stream(FILE *,FILE *);
  48. void Usage(void);
  49.  
  50. /* Declare Globals */
  51. FILE *fp;
  52.  
  53. main (int argc, char *argv[])
  54. {
  55.     int c, i, CleanUp, Mode = -1;
  56.     char CmdLine[128], *In_Flag,  Name[80], *tp1;
  57.  
  58.  /* Set Option Flags */
  59.     In_Flag = "w";
  60.     while (*argv[1] IS SLASH) {
  61.        for (tp1 = argv[1] + 1; *tp1 != NULL; tp1++) {
  62.           switch (toupper(*tp1)) {
  63.           case 'A': In_Flag = "a"; Mode = 1; break;
  64.           case 'R': Mode = 2; break;
  65.           case 'W': Mode = 1; break;
  66.           }
  67.        }
  68.  
  69.     /* SHIFT */
  70.        for (i = 1, --argc; i <= argc + 1; i++) argv[i] = argv[i+1];
  71.     }
  72.  
  73.  /* Determine Operating Mode */
  74.     if (INFLOW_EXISTS && open("\\STD ERR", 1) >= 0) exit(1);
  75.     unlink("\\STD ERR");
  76.     if (Mode < 0) Mode = INFLOW_EXISTS + 2*(OUTFLOW_EXISTS);
  77.     if (argc > 1 && *argv[1] != '$') Mode += 4;
  78.  
  79.     switch (Mode) {
  80.     case 0: Usage(); break;     /* Barefoot */
  81.     case 2:                     /* OutFlow Only */
  82.     case 3:                     /* Both InFlow & OutFlow (Ignore InFlow) */
  83.        if (argc > 1 && *argv[1] IS '$') {
  84.           strcpy(Name,"\\STD ");strcat(Name,++argv[1]);
  85.           if ((fp = fopen(Name,"r")) IS NULL) { perror(Name); exit(1); }
  86.           CleanUp = FALSE;
  87.        } else {
  88.           strcpy(Name,"\\STD OUT");
  89.           if ((fp = fopen(Name,"r")) IS NULL) {
  90.              strcpy(Name,"\\STD IN");
  91.              if ((fp = fopen(Name,"r")) IS NULL) Usage();
  92.           }
  93.           CleanUp = TRUE;
  94.        }
  95.        Stream(fp,stdout); unlink(Name);
  96.        if (CleanUp) { unlink("\\STD IN"); unlink("\\STD OUT"); }
  97.        exit(0);
  98.     case 1:                     /* InFlow Only */
  99.     default:                    /* InFlow w/ Command Text */
  100.        if (argc > 1 && *argv[1] IS '$') {
  101.           strcpy(Name,"\\STD ");strcat(Name,++argv[1]);
  102.           if ((fp = fopen(Name,In_Flag)) IS NULL) { perror(Name); exit(1); }
  103.        } else {
  104.           unlink("\\STD IN"); strcpy(Name,"\\STD OUT");
  105.           if ((fp = fopen(Name,In_Flag)) IS NULL) { perror(Name); exit(1); }
  106.        }
  107.        Stream(stdin,fp);
  108.        if (Mode IS 1) exit(0);
  109.     case 4:                     /* Shell Out & Execute Something */
  110.     case 6:                     /* OutFlow w/ Command Text */
  111.        rename("\\STD OUT","\\STD IN");
  112.        for (i = 1, *CmdLine = NULL; i < argc; i++) {
  113.           strcat(CmdLine,argv[i]); strcat(CmdLine," "); }
  114.        while ((tp1 = strchr(CmdLine,BANG)) != NULL) *tp1 = BAR;
  115.        while ((tp1 = strchr(CmdLine,DIT)) != NULL) *tp1 = QUOTE;
  116.        system(CmdLine); unlink("\\STD IN");
  117.        exit(0);
  118.     }
  119. }
  120.  
  121. void Stream(FILE *fp1, FILE *fp2)
  122. {
  123.     int c;
  124.  
  125.     while ((c = getc(fp1)) != EOF) if (c) putc(c,fp2);
  126.     fclose(fp);
  127. }
  128.  
  129.  
  130. void Usage(void)
  131. {
  132.     char   **dp = Documentation;
  133.  
  134.     for ( ; *dp; dp++) fprintf(stderr,"%s\n", *dp);
  135.     exit(1);
  136. }
  137.